/*
 * Colonia.h
 *
 *  Created on: 04/02/2013
 *      Author: vagner
 */

#ifndef COLONIA_H_
#define COLONIA_H_
#include "Grafo.h"
#include <vector>
#include "RamdomManager.h"
#include "Formiga.h"
#include <algorithm>


namespace tp2cn {


typedef struct{
	int idVertice;
	int numeroVisitas;

}Mediana;

bool comparaPorVisitas(const Mediana& m1, const Mediana& m2);
void ordenaVerticesCandidatos(std::vector<Mediana>& candidatas);

class Colonia {
private:
	int numVertices;
	int numMedianas;
	Vertice posicao;
	float txEvaporacao;
	std::vector<Formiga> formigueiro;
	Grafo* pGrafo;
	double ultimaSolucao;
	double melhorSolucao;
	MyMatrix* matrizFeromonio;
	std::vector<Mediana> Medianas;
	std::vector<Mediana> melhoresMedianas;

	Colonia();
	//Calcula o vetor probabilidade na escolha de medianas
	std::vector<long double> calculaVetorProbMedianas(int idVertice);
	//Calcula o vetor probabilidade na definição dos atendimentos
	std::vector<long double> calculaVetorProbAtendimentos(int idVertice,Grafo& grafo);
	std::vector<Mediana> escolheMedianas(Grafo* grafo, int numMedianas);
	bool comparaPorVisitas(const Mediana& m1, const Mediana& m2);
	void ordenaVerticesCandidatos(std::vector<Mediana>& candidatas);
	//Verifica se a posição atual de uma formiga é mediana
	bool isMediana(int& posicao);

public:
	Colonia(int& numMedianas, int numVertices, Grafo* grafo, int& numFormigas,float& txInicialFeromonio, float& txEvaporacao);
	virtual ~Colonia();
	void definePosicaoInicial(int& MAX_X, int& MAX_Y, int& modoInicial);
	/*
	 * Seleciona os p's pontos(medianas) que tiveram o maior número de visitas de formigas
	 */
	void selecionaMedianas();
	/*Muda a posição de formigas que não estão localizadas em medianas.
	 * Tais formigas são reposionadas em medianas de forma aleatoria
	 *
	 */
	void reposicionaFormigas();
	/*
	 * Define os pontos que serão atendidos por cada mediana.
	 * Fazendo que as formigas contidas nas medianas caminhem para os pontos
	 * que deverão ser atendidos.
	 *
	 */
	void defineAtendimentos();
	Vertice& getPosicaoColonia();
	std::string showMedianas();
	std::string showMelhoresMedianas();
	double getUltimaSolucao();
	double getMelhorSolucao();
	void redefineGrafo(Grafo& novoGrafo);
	void reiniciaMatrizFeromonio(float& txInicialFeromonio);
	void retornaFomigueiro(void);
	void show();
};

} /* namespace tp2cn */
#endif /* COLONIA_H_ */
